package com.woniu.teachmall.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Redis缓存服务类
 * 用于处理商品数据的缓存操作，包括分页数据和总数统计
 */
@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // Redis键的前缀和常量定义
    private static final String GOODS_PAGE_KEY = "goods:page:";    // 商品分页数据的键前缀
    private static final String GOODS_TOTAL_KEY = "goods:total";   // 商品总数统计的键
    private static final long CACHE_EXPIRE_TIME = 1;              // 缓存过期时间（分钟）

    /**
     * 缓存商品分页数据: goods:1
     * @param page 页码
     * @param goods 商品列表数据
     */
    public void cacheGoodsPage(int page, List<?> goods) {
        String key = GOODS_PAGE_KEY + page;//goods:1  goods:2
        //String key ="loginuser";
        redisTemplate.opsForValue().set(key, goods, CACHE_EXPIRE_TIME, TimeUnit.MINUTES);
    }

    /**
     * 获取缓存的商品分页数据 goods:1
     * @param page 页码
     * @return 商品列表数据，如果缓存不存在则返回null
     */
    public List<?> getGoodsPage(int page) {
        String key = GOODS_PAGE_KEY + page;
        return (List<?>) redisTemplate.opsForValue().get(key);
    }

    /**
     * 缓存商品总数
     * @param total 商品总数
     */
    public void cacheTotal(long total) {
        redisTemplate.opsForValue().set(GOODS_TOTAL_KEY, total, CACHE_EXPIRE_TIME, TimeUnit.MINUTES);
    }

    /**
     * 获取缓存的商品总数
     * @return 商品总数，如果缓存不存在则返回null
     */
    public Long getTotal() {
        Object value = redisTemplate.opsForValue().get(GOODS_TOTAL_KEY);

        if (value == null) {
            return null;
        }
        // 处理可能的类型转换，如果返回的是Integer类型，则转换为Long类型
        if (value instanceof Integer) {
            return ((Integer) value).longValue();
        }
        return (Long) value;
    }

    /**
     * 清除商品相关的所有缓存数据
     * 包括商品总数和分页数据
     */
    public void clearGoodsCache() {
        // 清除所有商品相关的缓存
        redisTemplate.delete(GOODS_TOTAL_KEY);
        // 这里可以添加清除所有分页缓存的逻辑
        // 实际项目中可能需要更复杂的缓存清理策略
    }
}